package com.andrew.util;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadBase;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class UploadUtils{
	
	//private static String tempPath="E:\\JavaEE_WorkSpace\\QweasBookStore\\WebContent\\temp";
	//private static String savePathStr= "E:\\JavaEE_WorkSpace\\QweasBookStore\\WebContent\\BookPicture";
	
	public static Map<String, String> upLoadPic(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		Properties properties = new Properties();
		// 使用ClassLoader加载properties配置文件生成对应的输入流
		 InputStream in = UploadUtils.class.getClassLoader().getResourceAsStream("upLoadPicture.properties");
		// 使用properties对象加载输入流
		properties.load(in);
		//获取key对应的value值
		String tempPath=properties.getProperty("tempPath");
		String savePathStr=properties.getProperty("savePath");
		
		System.out.println(tempPath+","+savePathStr);
		
		Map<String, String> map=new HashMap<>();
       //上传时生成的临时文件保存目录
       File file = new File(tempPath);
       if(!file.exists()&&!file.isDirectory()){
           System.out.println("目录或文件不存在！");
           file.mkdir();
       }
       try {
           //使用Apache文件上传组件处理文件上传步骤：
           //1、创建一个DiskFileItemFactory工厂
           DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
           //设置工厂的缓冲区的大小，当上传的文件大小超过缓冲区的大小时，就会生成一个临时文件存放到指定的临时目录当中。
           diskFileItemFactory.setSizeThreshold(1024*100);
           //设置上传时生成的临时文件的保存目录
           diskFileItemFactory.setRepository(file);
           //2、创建一个文件上传解析器
           ServletFileUpload fileUpload = new ServletFileUpload(diskFileItemFactory);
           //解决上传文件名的中文乱码
           fileUpload.setHeaderEncoding("UTF-8");
           //监听文件上传进度
//           fileUpload.setProgressListener(new ProgressListener(){
//               public void update(long pBytesRead, long pContentLength, int arg2) {
//                   System.out.println("文件大小为：" + pContentLength + ",当前已处理：" + pBytesRead);
//               }
//           });
           System.out.println("start");
           //设置上传单个文件的大小的最大值，目前是设置为1024*1024字节，也就是1MB
           fileUpload.setFileSizeMax(50*1024*1024);
           System.out.println("end");
           //设置上传文件总量的最大值，最大值=同时上传的多个文件的大小的最大值的和，目前设置为10MB
           fileUpload.setSizeMax(1024*1024*100);
           //4、使用ServletFileUpload解析器解析上传数据，解析结果返回的是一个List<FileItem>集合，每一个FileItem对应一个Form表单的输入项
           List<FileItem> list = fileUpload.parseRequest(request);
           System.out.println(list.size());
           
           for (FileItem item : list) {
               //如果fileitem中封装的是普通输入项的数据
               if(item.isFormField()){
                   String name = item.getFieldName();
                   //解决普通输入项的数据的中文乱码问题
                   String value = item.getString("UTF-8");
                   map.put(name, value);
                   System.out.println(name+value);
                   
               }else{
                   //如果fileitem中封装的是上传文件，得到上传的文件名称，
                   String fileName = item.getName();

                   System.out.println(fileName);
                   if(fileName==null||fileName.trim().equals("")){
                       continue;
                   }
                   //注意：不同的浏览器提交的文件名是不一样的，有些浏览器提交上来的文件名是带有路径的，如：  c:\a\b\1.txt，而有些只是单纯的文件名，如：1.txt
                   //处理获取到的上传文件的文件名的路径部分，只保留文件名部分
                   fileName = fileName.substring(fileName.lastIndexOf(File.separator)+1);
                   //得到上传文件的扩展名
                   String fileExtName = fileName.substring(fileName.lastIndexOf(".")+1);
                   if("zip".equals(fileExtName)||"rar".equals(fileExtName)||"tar".equals(fileExtName)||"jar".equals(fileExtName)){
                       request.setAttribute("message", "上传文件的类型不符合！！！");
                       request.getRequestDispatcher("/message.jsp").forward(request, response);
                       return new HashMap<>();
                   }
                   //如果需要限制上传的文件类型，那么可以通过文件的扩展名来判断上传的文件类型是否合法
                   System.out.println("上传文件的扩展名为:"+fileExtName);
                   //获取item中的上传文件的输入流
                   InputStream is = item.getInputStream();
                   //得到文件保存的路径
                   
                   System.out.println("保存路径为:"+savePathStr);
                   //创建一个文件输出流
                   FileOutputStream fos = new FileOutputStream(savePathStr+File.separator+fileName);
                   
                   map.put("filePath", savePathStr+File.separator+fileName);
                   map.put("fileName", fileName);
                   
                   //创建一个缓冲区
                   byte buffer[] = new byte[1024];
                   //判断输入流中的数据是否已经读完的标识
                   int length = 0;
                   //循环将输入流读入到缓冲区当中，(len=in.read(buffer))>0就表示in里面还有数据
                   while((length = is.read(buffer))>0){
                       //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中
                       fos.write(buffer, 0, length);
                   }
                   //关闭输入流
                   is.close();
                   //关闭输出流
                   fos.close();
                   //删除处理文件上传时生成的临时文件
                   item.delete();
                   System.out.println("success");
               }
           }
       } catch (FileUploadBase.FileSizeLimitExceededException e) {
           e.printStackTrace();
           	return new HashMap<>();
       }catch (FileUploadBase.SizeLimitExceededException e) {
           e.printStackTrace();
           return new HashMap<>();
       }catch (FileUploadException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
           return new HashMap<>();
       }
       
       return map;
	}
}
